class Solution {
public:
    int _diameterOfBinaryTree(TreeNode* root,int& ret)
    {
        if(root == nullptr)
        {
            return 0;
        }
        int leftlengthg = _diameterOfBinaryTree(root->left,ret);//计算我这个节点的左子树的最大深度
        int rightlength = _diameterOfBinaryTree(root->right,ret);
        if(leftlengthg+rightlength>ret)
        {
            ret = leftlengthg+rightlength;//这里没有进行+1，可以去模拟递归的过程去进行理解，这里就不应该+1
        }//如果当前计算的这个节点的深度大于了ret记录的深度，那么久更新ret
        return leftlengthg>rightlength?leftlengthg+1:rightlength+1;//否则就去寻找更长的深度
        //当我在选择的时候只能从左子树和右子树中选择一边，选择长的一遍当作深度，+1是因为从左子节点
        //或者右子节点到root这里又多了一条边，所以会+1，至于上面没有加1，是因为我的左子节点
        //到达root再从root到达右子节点在递归的过程中已经完成了堆直径的计算。没有增加的必要，而这里我需要往上去增加新的节点了，所以这里就增加了一条边就是从左子节点/右子节点到
        //root的边
    }
    int diameterOfBinaryTree(TreeNode* root) {
      //递归函数的目的为求出某一个节点的最大深度
      int ret = 0;
      _diameterOfBinaryTree(root,ret);
      return ret;
    }
};